from django.shortcuts import render

# Create your views here.


# urllib.parse.urlencode(query)
# 将query字典转换为url路径中的查询字符串

# urllib.parse.parse_qs(qs)
# 将qs查询字符串格式数据转换为python字典

# urllib.request.urlopen(url,data=none)
# 发送http请求，如果data为none，发送get请求，不为none发送post请求
# 返回response响应对象，可以通过read（）读取响应体数据，需要注意读取出来的数据为bytes类型

# APIView
# GenericAPIView      --序列化器
# ListAPIView，RetrieveAPIView
from django.shortcuts import render
from rest_framework.views import APIView
from urllib.parse import urlencode, parse_qs
from django.conf import settings
from mall import settings
from rest_framework.response import Response
from rest_framework import status
from urllib.request import urlopen
from .utils import OauthQQTool
from .models import OAuthQQUser
from oauth.serializers import QQTokenSerialzier

class QQOauthURLView(APIView):
    """
    GET     /oauth/qq/statues/
    1.前端根据用户的点击,发送一个 ajax 请求来获取 后端拼接好的url
    2. 我们要根据 qq的接口文档 生成一个url
    3. 把这个url返回回去
    """

    def get(self, request):

        qq = OauthQQTool()
        auth_url = qq.get_auth_url()

        return Response({'auth_url': auth_url})

from itsdangerous import TimedJSONWebSignatureSerializer, Serializer


class QQTokenView(APIView):
    """
    GET     /oauth/qq/users/?code=xxxxx
    1. 前端 通过一定的方式获取到用户扫描之后,qq返回的code
    2. 我们后台接收到这个code之后 用code换取token,
    3. 看接口文档实现对应的功能
    """

    def get(self, request):
        # 1.获取code
        code = request.query_params.get('code')
        if code is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        qq = OauthQQTool()
        try:
            token = qq.get_access_token_by_code(code)
            openid = qq.get_openid_by_token(token)
        except Exception:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        #已经获取到openid
        #要么用户绑定过，要么没绑定过

        #1.我们要如何知道是否绑定过，就是要查询数据库
        try:
            qq_user = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:

            #2.没有绑定过，需要将openid和user信息绑定
            #但我们绑定并不是在这里绑定， 我们需要将 openid 返回给前端
            #前端再将  用户的 用户名，密码，短信验证码 以及openid 提交再进行保存

            #对openid进行加密
            access_token = OAuthQQUser.generic_token_by_openid(openid)
            return Response({'access_token':access_token})

        else:
            #else什么时候执行？查询有这个用户的时候
            #3.绑定过，直接返回登陆token
            from rest_framework_jwt.settings import api_settings

            #需要获取2个方法
            # 补充生成记录登录状态的token
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
            #将用户信息放到payload中
            payload = jwt_payload_handler(qq_user.user)
            token = jwt_encode_handler(payload)

            return Response({
                'token':token,
                'user_id':qq_user.user.id,
                'username':qq_user.user.username,
            })

    def post(self,request):
        """   明确你的需求,分析已知条件, 根据已知条件,创建实现的步骤

        1. 前段应该将 短信,密码和手机号 以及 access_token(openid)的信息 传递给我们
        2. 后端接受到数据之后,对数据进行校验
        3.  user信息??? 我们根据手机号来判断
        4. 我们需要将 openid 和 user信息保存(绑定)起来
        """
        serializer = QQTokenSerialzier(data = request.data)
        serializer.is_valid()
        user = serializer.save()
        #绑定成功返回token
        from rest_framework_jwt.settings import api_settings

        # 需要获取2个方法
        # 补充生成记录登录状态的token
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        # 将用户信息放到payload中
        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)

        return Response({
            'token': token,
            'user_id': user.user.id,
            'username': user.user.username,
        })


#1.导入正确类文件
from itsdangerous import TimedJSONWebSignatureSerializer
#2.创建 序列化器对象
#参数一  ： 私钥
#参数二   ： 有效期
# serializer = Serializer('abc',3600)
#3.通过调用序列话器的 dumps 方法对铭感数据加密
# data = serializer.dumps({'openid':'123456'})

#4.对数据进行解密 loads
# serializer.load(data)
#5.异常
#加密数据有可能被篡改
#出现 BadSignature
#设置时间会过期
# serializer = Serializer('abc',1)

# data = serializer.dumps({'openid':'123456'})
# serializer.loads(data)
#SignatureExpired:  过期了





